/*
题目描述：

有这样一段程序：
f(n, m)
{
	if  n = 1 or m = 1
		return a[n][m];
	return f(n - 1, m) ^ f(n, m - 1);
}
input 2 <= n, m <= 100
for i = 2->100 input a[1][i]
for i = 2->100 input a[i][1]
output f(n, m)

程序的运行效率很低，所以当n和m较大时用时太长。不过机智的小b很快解决了这个问题。
这时小c出现了，他将n, m都增加131072，由于n, m的增加，读入变为2->131172的所有a[1][i]和a[i][1]。
小b犯了难，所以来找你，你能帮他解决这个问题吗？

输入：

第一行读入131171个正整数，表示a[1][i](i = 2->131172, 1 <= a[1][i] <= 1000000000)。

第二行读入131171个正整数，表示a[i][1](i = 2->131172, 1 <= a[1][i] <= 1000000000)。

第三行读入一个正整数Q(1 <= Q <= 10000)，表示询问次数。

接下来Q行，每行两个数n, m(2 <= n, m <= 100)，表示每一组询问。

输出：

Q行，每行为f(n + 131072, m + 131072)。



输入示例

2 3 4 5 6 7 8 ... 131171 131172
2 3 4 5 6 7 8 ... 131171 131172
3
2 2
2 3
2 4
输出示例

0
0
131072
*/
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#if defined(_WIN32) && !defined(__cplusplus)
#define inline __inline
#endif


#include <stdio.h>

#define OFFSET 131072
#define MAX_ITEM_NUM 131173
#define RANGE 101

static int row[MAX_ITEM_NUM];
static int column[MAX_ITEM_NUM];
static int ans[RANGE][RANGE];

static inline int f2(int n, int m)
{
	int result1 = 0;
	int result2 = 0;
	for (int i = 0, up = n - 2; i < m - 1; i++)
	{
		int down = n - 2 + i;
		if ((down & up) == up) // 奇数
			result1 ^= row[m - i];
	}

	for (int i = 0, up = m - 2; i < n - 1; i++)
	{
		int down = m - 2 + i;
		if ((down & up) == up) // 奇数
			result2 ^= column[n - i];
	}

	int result = result1 ^ result2;
	return result;
}

static inline int f(int n, int m)
{
	if (ans[n - OFFSET][m - OFFSET] >= 0) return ans[n - OFFSET][m - OFFSET];
	else return f2(n - OFFSET, m) ^ f2(n, m - OFFSET);
}

int main()
{
	row[0] = 0;
	row[1] = 0;
	column[0] = 0;
	column[1] = 0;

#ifdef _MSC_VER
	FILE *fp = fopen("test-49675.in", "r");
	if (fp == NULL) return 0;
#endif

	for (int i = 2; i < MAX_ITEM_NUM; i++)
	{
#ifdef _MSC_VER
		fscanf(fp, "%d", &row[i]);
#else
		scanf("%d", &row[i]);
#endif
}
	for (int i = 2; i < MAX_ITEM_NUM; i++)
	{
#ifdef _MSC_VER
		fscanf(fp, "%d", &column[i]);
#else
		scanf("%d", &column[i]);
#endif
	}
#ifdef _MSC_VER
	fclose(fp);
#endif

	for (int j = 0; j < RANGE; j++)
	{
		ans[0][j] = -1;
		ans[1][j] = -1;
		ans[j][0] = -1;
		ans[j][1] = -1;
	}

	for (int i = 2; i < RANGE; i++)
	{
		for (int j = 2; j < RANGE; j++)
		{
			ans[i][j] = f(i + OFFSET - 1, j + OFFSET) ^ f(i + OFFSET, j + OFFSET - 1);
		}
	}

	int Q;
	scanf("%d", &Q);
	for (int i = 0; i < Q; i++)
	{
		int n, m;
		scanf("%d%d", &n, &m);
		int result = f(n + OFFSET, m + OFFSET);
		printf("%d\n", result);
	}

	return 0;
}
